package com.info.zhiduoduo.core.util;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.google.common.collect.Maps;

import com.info.zhiduoduo.core.formbean.mqproducer.PhoneMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Created on 17/6/7.
 * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类，直接通过
 * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
 * 工程依赖了2个jar包(存放在工程的libs目录下)
 * 1:aliyun-java-sdk-core.jar
 * 2:aliyun-java-sdk-dysmsapi.jar
 * <p>
 * 备注:Demo工程编码采用UTF-8
 * 国际短信发送请勿参照此DEMO
 */
@Slf4j
public class SmsUtil {

	//产品名称:云通信短信API产品,开发者无需替换
	static final String product = "Dysmsapi";
	//产品域名,开发者无需替换
	static final String domain = "dysmsapi.aliyuncs.com";

	//此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
	static final String signName = "塾人微创业";
	//注册短信模板
	static final String TEMPLATE = "SMS_316835026";
	//审核短信模板
	static final String TEMPLATE_VERIFY = "SMS_316835026";
	static final String TEMPLATE_RECHARGE_APPLY = "SMS_316835026";
	static final String accessKeyId = "LTAI5tRumeo2otqWjTqqiwEy";
	static final String accessKeySecret = "m15NRcNVXbtNk9XNPBWwKCFam2zIbp";
	//创客纪念日短信模板
	static final String MAKER_ANNIVERSARY_TEMPLATE = "";
	//创客生日祝福短信模板
	static final String MAKER_BIRTH_TEMPLATE = "";

	/**
	 * @param phoneNo 		号码
	 * @param templateCode 	模板 eg:SMS_123
	 * @param params		对应的参数
	 * @return
	 * @throws ClientException
	 */
	public static SendSmsResponse sendSms(String phoneNo, String templateCode, Map<String, String> params) throws ClientException {

		//可自助调整超时时间
		System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
		System.setProperty("sun.net.client.defaultReadTimeout", "10000");

		//初始化acsClient,暂不支持region化
		IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
		DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
		IAcsClient acsClient = new DefaultAcsClient(profile);

		//组装请求对象-具体描述见控制台-文档部分内容
		SendSmsRequest request = new SendSmsRequest();
		//必填:待发送手机号
		request.setPhoneNumbers(phoneNo);
		//必填:短信签名-可在短信控制台中找到
		request.setSignName(signName);
		//必填:短信模板-可在短信控制台中找到
		request.setTemplateCode(templateCode);
		//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
		/*JSONObject jsonObject = new JSONObject();
		jsonObject.put("code", code);*/
		if (!CollectionUtils.isEmpty(params)) {
			request.setTemplateParam(JSON.toJSONString(params));
		}
		//hint 此处可能会抛出异常，注意catch
		SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
		System.out.println(sendSmsResponse);
		return sendSmsResponse;
	}

	private static QuerySendDetailsResponse querySendDetails(String bizId, String phoneNo) throws ClientException {

		//可自助调整超时时间
		System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
		System.setProperty("sun.net.client.defaultReadTimeout", "10000");

		//初始化acsClient,暂不支持region化
		IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
		DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
		IAcsClient acsClient = new DefaultAcsClient(profile);

		//组装请求对象
		QuerySendDetailsRequest request = new QuerySendDetailsRequest();
		//必填-号码
		request.setPhoneNumber(phoneNo);
		//可选-流水号
		request.setBizId(bizId);
		//必填-发送日期 支持30天内记录查询，格式yyyyMMdd
		SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
		request.setSendDate(ft.format(new Date()));
		//必填-页大小
		request.setPageSize(10L);
		//必填-当前页码从1开始计数
		request.setCurrentPage(1L);

		//hint 此处可能会抛出异常，注意catch
		QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);

		return querySendDetailsResponse;
	}

	/**
	 * @param phoneMessage 消息封装
	 * @return
	 * @throws ClientException
	 * @throws InterruptedException
	 */
	public static int send(PhoneMessage phoneMessage) throws ClientException, InterruptedException {

		//发短信
		log.info("开始发送短信->");
		String phone = phoneMessage.getPhone();
		int type = phoneMessage.getType();

		// 模板和对应的参数
		String templateCode;
		Map<String, String> params = Maps.newHashMap();
		if (type == 1) {
			templateCode = TEMPLATE_VERIFY;
			params.put("code", phoneMessage.getVerifycode());
		} else if (type == 2) {
			templateCode = TEMPLATE_RECHARGE_APPLY;
		} else {
			templateCode = TEMPLATE;
			params.put("code", phoneMessage.getVerifycode());
		}
		log.info("短信调用的模板: {}, 模板参数: {}", templateCode, JSON.toJSONString(params));

		SendSmsResponse response = sendSms(phone, templateCode, params); log.info("短信接口返回的数据----------------");
		log.info("Code=" + response.getCode());
		log.info("Message=" + response.getMessage());
		log.info("RequestId=" + response.getRequestId());
		log.info("BizId=" + response.getBizId());

		Thread.sleep(500L);

		//查明细
		if (response.getCode() != null && response.getCode().equals("OK")) {
			QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId(), phone);
			log.info("短信明细查询接口返回数据----------------");
			log.info("Code=" + querySendDetailsResponse.getCode());
			log.info("Message=" + querySendDetailsResponse.getMessage());
			int i = 0;
			for (QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs()) {
				log.info("SmsSendDetailDTO[" + i + "]:");
				log.info("Content=" + smsSendDetailDTO.getContent());
				log.info("ErrCode=" + smsSendDetailDTO.getErrCode());
				log.info("OutId=" + smsSendDetailDTO.getOutId());
				log.info("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
				log.info("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
				log.info("SendDate=" + smsSendDetailDTO.getSendDate());
				log.info("SendStatus=" + smsSendDetailDTO.getSendStatus());
				log.info("Template=" + smsSendDetailDTO.getTemplateCode());

			}
			log.info("TotalCount=" + querySendDetailsResponse.getTotalCount());
			log.info("RequestId=" + querySendDetailsResponse.getRequestId());
			return 0;
		}
		return -1;
	}

		public static void main(String[] args) throws ClientException {
		HashMap<String, String> params = Maps.newHashMap();
		params.put("code", "1234");
//		System.out.println(sendSms("18721605772", TEMPLATE_VERIFY, params).getBizId());

		System.out.println(querySendDetails("90A61950-2ECD-53BE-9350-99E520C556C6", "18721605772"));
	}
}
